;*********************************************************** ; シリアル受信動作チェックプログラム ; 1文字を受信し、その文字コードを LED 表示する ; 非同期式通信モード ; ボーレート 9600bps ; 8ビット・ノンパリティ ; 割り込みは使用しない ; 文字コードのLED 表示はPORTB ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ COUNT1 EQU 21H ; ループカウンタ1 COUNT2 EQU 22H ; ループカウンタ2 COUNT3 EQU 23H ; ループカウンタ3 COUNT4 EQU 24H ; ループカウンタ4 ORG 0 ; プログラムの開始番地の指定 ;*********************************************************** ; 送受信モードの初期化 ; (注)バンクの位置に注意 ;*********************************************************** BSF STATUS,RP0 ; Bank 1 へ切替 MOVLW B'10111111' ; RC7/RX(入力),RC6/TX(出力) MOVWF TRISC ; PORTC の設定 CLRF TRISB ; PORTB 全ポートを出力に設定 MOVLW B'00100100' ; 8BIT,送信許可,非同期,高速 MOVWF TXSTA ; TXSTA レジスタの設定 MOVLW 81H ; ボーレート 9600bps (20MHz:高速設定時) MOVWF SPBRG ; SPBRG レジスタの設定 BCF STATUS,RP0 ; Bank 0 へ戻す MOVLW B'10010000' ; シリアル,8BIT,継続受信許可 MOVWF RCSTA ; RCSTA レジスタの設定 ;*********************************************************** ; メインプログラム(受信ルーチン) ; ; データを受信し、その文字コードを PORTB の LED に表示する。 ; もし、受信エラーが発生したら、LEDを点滅させる。 ;*********************************************************** MOVLW B'11111111' ; 11111111 を Wreg にロードする MOVWF PORTB ; PORTBへ出力(LEDを全点灯させ受信待ち) CALL TIME1S ; 1秒のウエイトを入れる MOVLW B'00000000' ; 00000000 を Wreg にロードする MOVWF PORTB ; PORTBへWregのデータを出力(LEDの消灯) LPRCV BTFSS PIR1,RCIF ; USART 受信割り込みフラグビットのチェック GOTO LPRCV ; PIR1 レジスタの RCIF が「0」だったら ; LPRCV ラベル間をループする ; ; ****** エラーチェック ****** BTFSC RCSTA,FERR ; フレーミングエラーのチェック(1:エラー,0:正常) GOTO FRAME ; フレーミングエラー時 FRAME のラベルへジャンプする BTFSC RCSTA,OERR ; オーバーランエラーのチェック(1:エラー,0:正常) GOTO OVER ; オーバーランエラー時 OVER のラベルへジャンプする ; ****** 受信データの格納 ****** MOVF RCREG,W ; RCREGレジスタから受信データを読み込む MOVWF PORTB ; PORTBへ出力(文字コードに相当するLEDを点灯させる) GOTO LPRCV ; 受信繰り返し ;*********************************************************** ; 受信エラー処理 ;*********************************************************** FRAME ; <フレーミングエラー時の処理>(LEDを点滅させる) MOVF RCREG,W ; ダミーの入力(RCREGをリードするとFERRがクリアされる) MOVLW B'01010101' ; 01010101 を Wreg にロードする MOVWF PORTB ; PORTBへ出力(LEDを点灯させる) CALL TIME1S ; 1秒間ウエイト MOVLW B'00000000' ; 00000000 を Wreg にロードする MOVWF PORTB ; PORTBへ出力(LEDを消灯させる) CALL TIME1S ; 1秒間ウエイト GOTO FRAME ; 点滅を繰り返す OVER ; <オーバーランエラー時の処理>(LEDを点滅させる) BCF RCSTA,CREN ; OERRのリセット(ビットCREN のクリアによりクリアする) BSF RCSTA,CREN ; 連続受信を許可する MOVLW B'10101010' ; 10101010 を Wreg にロードする MOVWF PORTB ; PORTBへ出力(LEDを点灯させる) CALL TIME1S ; 1秒間ウエイト MOVLW B'00000000' ; 00000000 を Wreg にロードする MOVWF PORTB ; PORTBへ出力(LEDを消灯させる) CALL TIME1S ; 1秒間ウエイト GOTO OVER ; 点滅を繰り返す ;*********************************************************** ;遅延サブルーチン ;*********************************************************** ;100μs遅延サブルーチン(20MHzクロック時) TIME100 MOVLW 0A5H ; 1サイクル A5H=165 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(165-1)+2 = 166サイクル GOTO LOOP ; 2×(165-1) = 328サイクル RETURN ; 2サイクル ;10ms遅延サブルーチン(20MHzクロック時) TIME10M MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT1 ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP1 CALL TIME100 ; (2+500)×99=49698サイクル DECFSZ COUNT1,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP1 ; 2×(99-1) = 196サイクル RETURN ; 2サイクル ;1s遅延サブルーチン(20MHzクロック時) TIME1S MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT2 ; 1サイクル MOVLW 62H ; 1サイクル 62H=98 MOVWF COUNT3 ; 1サイクル MOVLW 03H ; 1サイクル 03H=3 MOVWF COUNT4 ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP2 CALL TIME10M ;(2+50000)×99=4950198サイクル DECFSZ COUNT2,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP2 ; 2×(99-1) = 196サイクル LOOP3 CALL TIME100 ;(2+500)×98=49196 DECFSZ COUNT3,F ; 1×(98-1)+2 = 99サイクル GOTO LOOP3 ; 2×(98-1) = 194サイクル LOOP4 DECFSZ COUNT4,F ; 1×(3-1)+2 = 4サイクル GOTO LOOP4 ; 2×(3-1) = 4サイクル RETURN ; 2サイクル END